// ============================== 导入依赖 ============================== //

import IS from './is'

// ============================== 导出字典工具 ============================== //

export default {
  /**
   * 字典翻译
   *
   * @param {Array} dictList      字典列表 DICT.STATUS / [[code, word], [code, word]]
   * @param {String, Number} data 数据
   * @param {Number} index        序号
   * @param {String} empty        空值占位 '' 或 '-' 或 '无'
   *
   * @returns {Array} dataList 数据列表
   */
  dict(dictList, data, index = 1, empty = '') {
    if (!IS.isArray(dictList)) return empty
    const matched = dictList.find((dict) => dict[0] === data)
    return matched ? matched[index] : empty
  },

  /**
   * 结构树字典翻译
   *
   * @param {Array} dictList      字典列表 DICT.STATUS / [[code, word], [code, word]]
   * @param {String, Number} data 数据
   * @param {Number} index        序号
   * @param {String} empty        空值占位 '' 或 '-' 或 '无'
   *
   * @returns {Array} dataList 数据列表
   */
  dictTree(dictTree, data, index = 2, empty = '') {
    if (!IS.isArray(dictTree)) return empty
    const nameList = getTreeName(dictTree, data, index, empty, []) || [empty]
    return nameList.pop()
  },

  /**
   * 结构树字典全路径翻译
   *
   * @param {Array} dictList      字典列表 DICT.STATUS / [[code, word], [code, word]]
   * @param {String, Number} data 数据
   * @param {Number} index        序号
   * @param {String} empty        空值占位 '' 或 '-' 或 '无'
   * @param {String} and          连接符
   *
   * @returns {Array} dataList 数据列表
   */
  dictTreeAll(dictTree, data, index = 2, empty = '', and) {
    if (!IS.isArray(dictTree)) return empty
    const nameList = getTreeName(dictTree, data, index, empty, []) || [empty]
    return nameList.join(and || this.MAP.AND)
  },

  /**
   * 字典转为映射
   *
   * @param {Array} dictList 字典列表 DICT.STATUS / [[code, word], [code, word]]
   *
   * @returns {Object} dataMap 数据映射
   */
  dictToMap(dictList) {
    if (!IS.isArray(dictList)) return {}
    return dictList.reduce((obj, dict) => {
      if (dict.length > 1) obj[dict[0]] = dict[1]
      return obj
    }, {})
  },

  /**
   * 映射转为字典
   *
   * @param {Object} dataMap 数据映射
   *
   * @returns {Array} dictList 字典列表
   */
  dictFormMap(dataMap) {
    if (!IS.isJSON(dataMap)) return []
    return dataMap.keys().map((key) => [key, dataMap[key]])
  },

  /**
   * 列表转为字典
   *
   * @param {Array} dataList 数据列表
   * @param {String} idKey   ID 键名
   * @param {String} nameKey 名称键名
   *
   * @returns {Array} dictList 字典列表
   */
  dictFormList(dataList, idKey, nameKey) {
    if (!IS.isArray(dataList) || !idKey || !nameKey) return []
    return dataList.map((data) => [data[idKey], data[nameKey]])
  },
}

// ============================== 内部方法 ============================== //

const getTreeName = (tree, data, index, empty, nameList) => {
  for (const node of tree) {
    const newList = [...nameList, node[index] || empty]
    if (node[1] === data) return newList

    const nodeReturn = getTreeName(node[0], data, index, empty, newList)
    if (nodeReturn) return nodeReturn
  }
}
